<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /*
      1. 什么是闭包？
        一个包含引用外部函数局部变量的“closure”对象，存在内部函数中

      2. 产生原因（条件）：
        - 函数嵌套
        - 内部函数引用外部函数的局部变量
        - 调用外部函数

      3. 作用（优点）：
        - 延长局部变量生命周期（存活时间）
        - 让函数外部操作函数内部数据

      4. 缺点：
        - 可能导致内存泄漏

        解决方案：不用的时候，将内部函数变成垃圾对象（null），
        垃圾回收机制会回收内部函数，因为闭包存在内部函数中，所以闭包也被回收了

      5. 闭包生命周期
        产生: 调用外部函数时产生（当内部函数定义执行完成）
        死亡: 内部函数变成垃圾对象

      6. 应用
        React高阶组件，高阶函数等
        实际开发很少直接使用闭包。研究Vue响应式原理，在数据劫持阶段，内部以闭包形式存了dep对象，存在属性get/set方法中
    */
      // var d = 4;
      // function fn1() {
      //   debugger;
      //   var a = 1;
      //   var b = 2;
      //   function fn2() {
      //     var c = 3;
      //     console.log(a, d);
      //   }
      //   console.log(fn2);
      // }
      // fn1();

      function fn1() {
        debugger;
        var a = 1;
        // 当内部函数定义执行完成时，才产生闭包
        var fn2 = function () {
          console.log(a);
        };
        console.log(fn2);
      }
      fn1();
    </script>
  </body>
</html>
